#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/1/30 10:41
# @Author  : Ramsey
# @Site    : zh
# @File    : task_manager.py
# @Software: PyCharm
import asyncio
from asyncio import Task, Future, Semaphore
from typing import Set, Final


class TaskManager:
    def __init__(self, max_semaphore: int = 20):
        self.current_task: Final[Set] = set()
        self.semaphore: Semaphore = Semaphore(max_semaphore)
        print(f"当前的并发数量是: {max_semaphore}")

    def create_task(self, coroutine) -> Task:
        task = asyncio.create_task(coroutine)
        self.current_task.add(task)

        def done_callback(_future: Future):
            """
            回调机制约定：
                当asyncio的任务完成时，它会将自己（Task对象）作为唯一参数传递给所有注册的回调函数。
                即使回调函数不需要使用这个参数，也必须声明接受它，否则会引发TypeError（参数数量不匹配）。
            :return:
            """
            self.current_task.remove(task)
            self.semaphore.release()

        task.add_done_callback(done_callback)
        return task

    def idea(self):
        return len(self.current_task) == 0


if __name__ == "__main__":
    pass
